NVM Express (缩写NVMe ),或称非易失性内存主机控制器接口规范 (英语:N on-V olatile M emory H ost C ontroller I nterface S pecification ,缩写:NVMHCIS ),是一个逻辑装置接口规范 。它是基于装置逻辑接口的总线 传输协议规范(相当于通讯协议中的应用层 ),用于访问通过PCI Express (PCIe)总线附加的非易失性存储器 介质(例如采用闪存 的固态盘机 ),虽然理论上不一定要求PCIe总线协议。NVMe是一种协议,是一组允许SSD使用PCIe总线的软硬件标准;而PCIe是实际的物理连接通道。
Quick Facts 简称, 成立时间 ...
Close
NVM代表非易失性存储器(non-volatile memory)的首字母缩略字 ,这是固态硬盘(SSD)的常见的闪存形式。此规范主要是为基于闪存的存储装置提供一个低延时、内部并发化的原生界面规范,也为现代CPU 、电脑平台及相关应用提供原生存储并发化的支持[ 1] ,令主机硬件和软件可以充分利用固态存储装置的并行化存储能力。相比此前机械硬盘驱动器 (HDD)时代的AHCI (SATA下的协议),NVMe/NVMHCI降低了I/O 操作等待时间、提升同一时间内的操作数、更大容量的操作队列等。
依托于PCIe总线,NVMe装置可适用于各种支持PCIe总线的物理插槽上,包括标准尺寸的PCIe扩展卡 (一般是4个PCIe通道)[ 2] 、采用U.2 物理连接界面(SFF-8639)的2.5英寸/3.5英寸标准尺寸固态盘机、[ 3] [ 4] SATA Express 总线(兼容于PCIe)的装置、M.2 规格扩展卡等。[ 5] 此规范由NVMHCIS工作组负责管理。
历史上,大多数SSD使用如SATA 、SAS 或光纤通道 等接口与电脑接口的总线 连接。随着固态硬盘在大众市场上的流行,SATA已成为个人电脑 中连接SSD的最典型方式;但是,SATA的设计主要是作为机械硬盘驱动器 (HDD)的接口,机械结构的HDD使用读取臂做读写,与直接操作固态颗粒的SSD差异很大,并随着时间的推移越来越难满足速度日益提高的SSD。[ 6] 随着在大众市场的流行,许多固态硬盘的数据速率提升已经放缓。不同于机械硬盘,部分SSD已受到SATA最大吞吐量 的限制。
在NVMe出现之前,高端SSD只得以采用PCI Express总线制造,但需使用非标准规范的接口。若使用标准化的SSD接口,操作系统 只需要一个驱动程式就能使用符合规范的所有SSD。这也意味着每个SSD制造商不必用额外的资源来设计特定接口的驱动程式。[ 7]
截至2014年9月,在光纤通道 (FC)上使用NVMe的新标准也正在开发。[ 8]
截止2018年,NVMe包含NVMe、NVMe-MI以及NVMe-oF(NVMe over Fabrics)三个细分协议,其中NVMe为主协议,规范了host对盘的读写、访问以及资源管理等功能,NVMe-MI主要包括带外管理相关的功能,NVMe-oF主要是基于NVMe的网络协议规范,可以将FC等网络协议与NVMe进行结合起来。同时,并且三个协议在协同演进,未来将会围绕NVMe形成一个从盘到存储系统的端到端生态。
NVMe标准对比AHCI标准:
当数据从存储传输到伺服器主机时,会进入一行或队列。传统的SATA连接只能支持一个队列,一次只能接收32条数据。而NVMe存储支持最多64000个队列,每个队列有64000个条目。
NVMe使用原生PCIe 通道,免去了SATA与SAS接口的主机控制器 与CPU通信所带来的延时。NVMe标准的延时只有AHCI的一半不到:NVMe精简了调用方式,执行命令时不需要读取寄存器;而AHCI每条命令则需要读取4次寄存器,一共会消耗8000次CPU循环,从而造成大概2.5微秒的延迟。
NVMe支持同时从多核处理器 接受命令和优先处理请求,这在企业级的重负载时优势明显。
NVMe加入了自动功耗状态切换和动态能耗管理功能。装置从Power State 0闲置50ms后可以切换到Power State 1;继续闲置的话,在500ms后又会进入功耗更低的Power State 2,切换时会有短暂延迟。SSD在闲置时可以非常快速的控制在极低的水平,在功耗管理上NVMe标准的SSD会比AHCI SSD拥有较大优势。
2009年Intel开始着手寻找SATA 的替代方案。SATA作为串行接口,采用AHCI规范,其已经成为制约SSD速度的瓶颈。AHCI只有1个命令队列,队列深度32。而NVMe可以有65535个命令队列,每个队列都可以深达65536个命令。NVMe也充分使用了MSI的2048个中断向量优势,延迟大大减小。最新的版本是2.0c;最大带宽约为16GB/s。[ 9]
2018年,基于NVMe的SSD已经可以突破15TB可用容量,读带宽达到6GB/s,100万IOPS(4KB随机读),同时保证微秒级延迟。[ 10]
产品规格:
1.0e(2013年1月)
1.1b(2014年7月)
1.2(2014年11月)
1.2a(2015年10月)
1.2b(2016年6月)
1.2.1(2016年6月)
1.3(2017年5月)
1.3a(2017年10月)
1.3b(2018年5月)
1.3c(2018年5月)
1.3d(2019年3月)
1.4(2019年6月)
1.4a(2020年3月)
1.4b(2020年9月)
2.0(2021年5月)[ 11]
2.0a(2021年7月)
2.0b(2022年1月)
2.0c(2022年10月)
Linux内核的存储控制堆栈中,NVMe的资料路径、不同层面下多重内部队列的位置[ 12]
9Front
2017年3月30日,NVMe驱动程式发布并供使用[ 13]
Chrome OS
2015年2月24日,加入NVMe驱动至内核和开机加载程序,可从NVMe装置启动Chrome OS[ 14] [ 15]
DragonFly BSD
DragonFly 4.6开始内建NVMe驱动程式[ 16]
FreeBSD
Intel赞助开发的驱动程式已内建于FreeBSD的head、stable/9分支中。[ 17] [ 18] nvd(4)和nvme(4)驱动程式则是在10.2版FreeBSD中开始默认内建于其中。[ 19]
Haiku
Haiku已有驱动开发时程,但是目前仍未完成[ 20]
illumos
illumos于2014年10月15日获得驱动程式支持[ 21]
iOS
iOS 9开始支持,首款配备了NVMe接口的装置是iPhone 6S /6S Plus ,也是首款采用NVMe的移动设备。物理接口和UFS 相同的采用M-PHY PCIe 。接下来Apple 推出的iPad Pro 和iPhone SE 也采用了NVMe[ 22]
Linux
NVMe的驱动程式最早是英特尔提供的,适用于Linux的内核驱动程式模块。[ 23] [ 24] [ 25] 这个模块在2012年3月19日集成到Linux内核 的主线驱动程式当中,Linux内核3.3版开始内建支持而无需安装额外模块。[ 26]
NVMe采用了多队列设计,最高支持64k个队列。2014年1月19日的Linux内核 3.13版开始,block层增加了multi-queue block layer,这一模块可以充分利用多核CPU和底层高速SSD硬件资源,主机CPU的I/O提交队列可以与SSD侧的提交队列进行绑定,即是说每个CPU核可以与SSD硬件的队列进行1:1或者n:m(比值取决于硬件设计)进行配置。对上层应用仍然是通用的块接口。从应用的角度,在某一个CPU Core上产生的IO请求,中断也会在此CPU Core处理, 性能更优。在SSD性能不是瓶颈的情况下,应用的性能能够实现在多核环境下按照CPU Core的数量扩展,这点与AHCI的CPU单队列访问存储装置的机制有所不同。
2015年4月12日发布的Linux内核 4.0版开始,VirtIO区块层驱动程式,SCSI 驱动层(与SATA 驱动共享)、回环装置 驱动(loop device ) UBI(unsorted block images )驱动(供闪存实现区块擦写管理)以及RBD 驱动程式(which exports Ceph RADOS objects as block devices)都被修改,以适应及适配越来越多的NVMe装置[ 27] [ 28] [ 29]
NetBSD
NetBSD在2016年的开发版本中初步支持NVMe。[ 30]
OpenBSD
OpenBSD的NVMe驱动程式自2014年6月开始,由此前开发并发布USB 、AHCI 驱动程式的高级开发团队负责。[ 31] OpenBSD 6.0开始正式支持。[ 32]
OS X/macOS
Mac OS X 10.10.3(OS X Yosemite )开始支持NVMe。苹果公司的Retina MacBook 和2016年发布MacBook Pro ,配备了使用NVMe的PCIe SSD作为主硬盘驱动器使用。[ 33]
Solaris
Solaris自Oracle Solaris 11.2开始支持NVMe。[ 34]
VMware
英特尔发布了供VMWare使用的NVMe驱动程式,[ 35] vSphere 6.0以及其后的版本中,均包含了该驱动程式,支持多种NVMe装置。[ 36] 在 vSphere 6 update 1 更新中,VMWare的VSAN软件模拟的存储子系统也开始支持NVMe装置。[ 37]
Windows
微软在Windows 8.1 和Windows Server 2012 R2 开始,原生支持NVMe装置。[ 38] [ 39] 同时也为Windows 7 和Windows Server 2008 R2 提供原生驱动程式支持(Windows 7与Windows Server 2008 R2默认不支持NVMe,需由用户自行下载获取)。[ 40]
除了微软官方提供的驱动程式以外,OpenFabrics Alliance 也有维护一套开放原始码的NVMe驱动程式,使用于Windows 7、8、8.1、10以及Windows Server 2008 R2、2012、2012 R2,这套驱动程式由数个加入了NVMe工作组的公司开发,包括IDT 、英特尔以及LSI 。[ 41] 当前版本为2016年12月发布的1.5。[ 42]
Compare: NVM Express . NVM Express, Inc. [2017-01-24 ] . (原始内容存档 于2017-02-07). NVMe™ is designed from the ground up to deliver high bandwidth and low latency storage access for current and future NVM technologies.
Keith Busch. Linux NVMe Driver (PDF) . flashmemorysummit.com. 2013-08-12 [2013-11-05 ] . (原始内容存档 (PDF) 于2013-11-05).
David Gwynne. man 4 nvme . OpenBSD man page. 2016-04-14 [2016-08-07 ] . (原始内容存档 于2016-08-21).
nvme(7D) . Oracle. [2014-12-02 ] . (原始内容存档 于2015-12-09).
存档副本 . [2017-08-22 ] . (原始内容存档 于2017-05-10).
NVM Express – scalable, efficient, and industry standard (页面存档备份 ,存于互联网档案馆 )
LFCS: Preparing Linux for nonvolatile memory devices (页面存档备份 ,存于互联网档案馆 ), LWN.net , April 19, 2013, by Jonathan Corbet
Multipathing PCI Express Storage , Linux Foundation , March 12, 2015, by Keith Busch